/*
 * 01指针和数组.c
 *
 *  Created on: 2024年3月9日
 *      Author: HP
 */
#include<stdlib.h>
#include<math.h>
#include<time.h>

int main0601(){
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	int* p;
	p = arr;
	printf("%p\n", p);
	printf("%p\n", arr); // 和p一样，都是指向arr的地址
	printf("%d\n", *p); // 1
	printf("%d\n", *(arr+1)); // 2
	for(int i=0; i<10; i++){
		// printf("%d\n", arr[i]);
		printf("%d\n", p[i]); // 也可以这样写
	}

	for(int i=0; i<10; i++){
		printf("%d\n", *p); // 也可以直接写成*p++
		p++;
	}
	printf("%p\n", arr);
	printf("%p\n", p); // 注意，此时p已经不等于arr了，因为最后一个p++，已经超出了arr的地址，此时它们之间差了28（16进制的），此时p已经变成一个野指针了

	int step = p - arr;
	printf("%d\n", step); // 两个指针相减得到的是它们之间的步长，但必须是同类型指针，比如两个int*指针

	// p和arr的区别：p是变量；arr是常量
	// p是一个指针，8字节；arr是数组，40字节（10 * int大小4字节）
	printf("指针类型大小：%d\n", sizeof(p)); // 8
	printf("数组大小：%d\n", sizeof(arr)); // 40

	return 0;
}

// 数组作为函数参数会退化为指针，所以必须传入数组长度，并不能像java那样计算数组长度
void bubbleSort1(int arr[]) {
	int len = sizeof(arr) / sizeof(arr[0]); // 8/4=2
	printf("%d\n", len);
}

void bubbleSort2(int* arr, int length) {
	for(int i=0; i<length; i++){
		for(int j=0; j<length-1-i; j++){
			if(*(arr+j) > *(arr+j+1)){
				int temp = *(arr+j);
				*(arr+j) = *(arr+j+1);
				*(arr+j+1) = temp;
			}
		}
	}
}

int main060101(){
	int arr[] = {10,2,6,4,3,9,5,8,7,1};
	bubbleSort1(arr);
	bubbleSort2(arr, 10);
	for(int i=0; i<10; i++){
		printf("%d\n", arr[i]);
	}
}
